// 用于axios的封装
// axios.create:生成一个新的axios.同时可以按照我们需求个性定制化
import axios from 'axios'
import { Toast } from 'vant' // Toast===this.$toast
import store from '@/store'
import router from '@/router'
const request = axios.create({
  timeout: 5000,
  baseURL: 'http://toutiao.itheima.net'
})
// 添加请求拦截器
request.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    // t=123
    // console.log('config', config)
    // 统一token处理
    if (store.state.tokenObj.token) {
      config.headers.Authorization = `Bearer ${store.state.tokenObj.token}`
    }
    // config.url = config.url + '?t=123'
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加request的响应拦截
request.interceptors.response.use(
  function (response) {
    // 接口状态码2开头
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    return response.data
  },
  async function (error) {
    // console.log('error', error)
    // 统一错误处理
    if (error.response && error.response.data) {
      if (error.response.status === 401) {
        // 通过refresh_token拿到一个新的token(需要调用接口获取)
        // 接口调用不能使用request(request使用了请求拦截的token)
        try {
          const res = await axios({
            url: 'http://toutiao.itheima.net/v1_0/authorizations',
            method: 'put',
            headers: {
              Authorization: `Bearer ${store.state.tokenObj.refresh_token}`
            }
          })
          console.log('抢救token', res)
          // 存储重新获取的token
          store.commit('setTokenObj', {
            token: res.data.data.token,
            refresh_token: store.state.tokenObj.refresh_token
          })
          // 重新请求上一次的接口（重新请求error.config的接口）
          const res2 = await request(error.config)
          // return new Promise((resolve,reject)=>{resolve(res2)})
          return res2
          // console.log('res2', res2)
        } catch {
          // token失效：无效了，直接放弃
          // 如果token失效   删除token,重新跳转到登陆页
          // 删除token
          // token抢救失败的提示
          Toast.fail(error.response.data.message)
          store.commit('logout')
          // 跳转到登陆页
          router.push('/login?redirect=' + location.href.split('#')[1])
        }
      } else {
        // 针对其它错误的提示
        Toast.fail(error.response.data.message)
      }
    }
    // 接口状态码非2开头
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    // return new Promise((resolve,reject)=>{reject(error)})  接口会执行.catch
    return Promise.reject(error)
  }
)

export default request
